{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "klGNgWREsvQv"
   },
   "source": [
    "<a href=\"https://colab.research.google.com/github/jeffheaton/t81_558_deep_learning/blob/master/t81_558_class_12_03_keras_reinforce.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "pmDI-h7cI0tI"
   },
   "source": [
    "# T81-558: Applications of Deep Neural Networks\n",
    "**Module 12: Reinforcement Learning**\n",
    "* Instructor: [Jeff Heaton](https://sites.wustl.edu/jeffheaton/), McKelvey School of Engineering, [Washington University in St. Louis](https://engineering.wustl.edu/Programs/Pages/default.aspx)\n",
    "* For more information visit the [class website](https://sites.wustl.edu/jeffheaton/t81-558/)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "lsaQlK8fFQqH"
   },
   "source": [
    "# Module 12 Video Material\n",
    "\n",
    "* Part 12.1: Introduction to the OpenAI Gym [[Video]](https://www.youtube.com/watch?v=_KbUxgyisjM&list=PLjy4p-07OYzulelvJ5KVaT2pDlxivl_BN) [[Notebook]](https://github.com/jeffheaton/t81_558_deep_learning/blob/master/t81_558_class_12_01_ai_gym.ipynb)\n",
    "* Part 12.2: Introduction to Q-Learning [[Video]](https://www.youtube.com/watch?v=A3sYFcJY3lA&list=PLjy4p-07OYzulelvJ5KVaT2pDlxivl_BN) [[Notebook]](https://github.com/jeffheaton/t81_558_deep_learning/blob/master/t81_558_class_12_02_qlearningreinforcement.ipynb)\n",
    "* **Part 12.3: Keras Q-Learning in the OpenAI Gym** [[Video]](https://www.youtube.com/watch?v=qy1SJmsRhvM&list=PLjy4p-07OYzulelvJ5KVaT2pDlxivl_BN) [[Notebook]](https://github.com/jeffheaton/t81_558_deep_learning/blob/master/t81_558_class_12_03_keras_reinforce.ipynb)\n",
    "* Part 12.4: Atari Games with Keras Neural Networks [[Video]](https://www.youtube.com/watch?v=co0SwPWoZh0&list=PLjy4p-07OYzulelvJ5KVaT2pDlxivl_BN) [[Notebook]](https://github.com/jeffheaton/t81_558_deep_learning/blob/master/t81_558_class_12_04_atari.ipynb)\n",
    "* Part 12.5: Application of Reinforcement Learning [[Video]](https://www.youtube.com/watch?v=1jQPP3RfwMI&list=PLjy4p-07OYzulelvJ5KVaT2pDlxivl_BN) [[Notebook]](https://github.com/jeffheaton/t81_558_deep_learning/blob/master/t81_558_class_12_05_apply_rl.ipynb)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cKOCZlhUgXVK"
   },
   "source": [
    "# Google CoLab Instructions\n",
    "\n",
    "The following code ensures that Google CoLab is running the correct version of TensorFlow."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Y0WC-M08zNNq",
    "outputId": "e2f38ce2-e7c8-4682-c589-c0900ac5ff80"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: using Google CoLab\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    from google.colab import drive\n",
    "    %tensorflow_version 2.x\n",
    "    COLAB = True\n",
    "    print(\"Note: using Google CoLab\")\n",
    "except:\n",
    "    print(\"Note: not using Google CoLab\")\n",
    "    COLAB = False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "1u9QVVsShC9X"
   },
   "source": [
    "# Part 12.3: Keras Q-Learning in the OpenAI Gym\n",
    "\n",
    "As we covered in the previous part, Q-Learning is a robust machine learning algorithm. Unfortunately, Q-Learning requires that the Q-table contain an entry for every possible state that the environment can take. Traditional Q-learning might be a good learning algorithm if the environment only includes a handful of discrete state elements. However, the Q-table can become prohibitively large if the state space is large.\n",
    "\n",
    "Creating policies for large state spaces is a task that Deep Q-Learning Networks (DQN) can usually handle. Neural networks can generalize these states and learn commonalities. Unlike a table, a neural network does not require the program to represent every combination of state and action. A DQN maps the state to its input neurons and the action Q-values to the output neurons. The DQN effectively becomes a function that accepts the state and suggests action by returning the expected reward for each possible action. Figure 12.DQL demonstrates the DQN structure and mapping between state and action.\n",
    "\n",
    "**Figure 12.DQL: Deep Q-Learning (DQL)**\n",
    "![Deep Q-Learning](https://raw.githubusercontent.com/jeffheaton/t81_558_deep_learning/master/images/deepqlearning.png \"Reinforcement Learning\")\n",
    "\n",
    "As this diagram illustrates, the environment state contains several elements. For the basic DQN, the state can be a mix of continuous and categorical/discrete values. For the DQN, the discrete state elements the program typically encoded as dummy variables. The actions should be discrete when your program implements a DQN. Other algorithms support continuous outputs, which we will discuss later in this chapter.\n",
    "\n",
    "This chapter will use [TF-Agents](https://www.tensorflow.org/agents) to implement a DQN to solve the cart-pole environment. TF-Agents makes designing, implementing, and testing new RL algorithms easier by providing well-tested modular components that can be modified and extended. It enables fast code iteration with functional test integration and benchmarking.\n",
    "\n",
    "## DQN and the Cart-Pole Problem\n",
    "\n",
    "Barto (1983) first described the cart-pole problem. [[Cite:barto1983neuronlike]](http://www.derongliu.org/adp/adp-cdrom/Barto1983.pdf) A cart is connected to a rigid hinged pole. The cart is free to move only in the vertical plane of the cart/track. The agent can apply an impulsive \"left\" or \"right\" force F of a fixed magnitude to the cart at discrete time intervals. The cart-pole environment simulates the physics behind keeping the pole reasonably upright position on the cart. The environment has four state variables:\n",
    "* $x$ The position of the cart on the track.\n",
    "* $\\theta$ The angle of the pole with the vertical\n",
    "* $\\dot{x}$ The cart velocity.\n",
    "* $\\dot{\\theta}$ The rate of change of the angle.\n",
    "\n",
    "The action space consists of discrete actions:\n",
    "* Apply force left\n",
    "* Apply force right\n",
    "\n",
    "To apply DQN to this problem, you need to create the following components for TF-Agents.\n",
    "\n",
    "* Environment\n",
    "* Agent\n",
    "* Policies\n",
    "* Metrics and Evaluation\n",
    "* Replay Buffer\n",
    "* Data Collection\n",
    "* Training\n",
    "\n",
    "These components are standard in most DQN implementations. Later, we will apply these same components to an Atari game, and after that, a problem with our design. This example is based on the [cart-pole tutorial](https://github.com/tensorflow/agents/blob/master/docs/tutorials/1_dqn_tutorial.ipynb) provided for TF-Agents. \n",
    "\n",
    "First, we must install TF-Agents.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "FreS1XOPzO9X",
    "outputId": "fa4e116c-0511-499b-b2e9-e3f8fbeb6e6c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reading package lists... Done\n",
      "Building dependency tree       \n",
      "Reading state information... Done\n",
      "ffmpeg is already the newest version (7:3.4.8-0ubuntu0.2).\n",
      "Suggested packages:\n",
      "  mesa-utils\n",
      "The following NEW packages will be installed:\n",
      "  libxxf86dga1 x11-utils xvfb\n",
      "0 upgraded, 3 newly installed, 0 to remove and 39 not upgraded.\n",
      "Need to get 993 kB of archives.\n",
      "After this operation, 2,982 kB of additional disk space will be used.\n",
      "Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxxf86dga1 amd64 2:1.1.4-1 [13.7 kB]\n",
      "Get:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 x11-utils amd64 7.7+3build1 [196 kB]\n",
      "Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 xvfb amd64 2:1.19.6-1ubuntu4.10 [784 kB]\n",
      "Fetched 993 kB in 0s (7,377 kB/s)\n",
      "debconf: unable to initialize frontend: Dialog\n",
      "debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76, <> line 3.)\n",
      "debconf: falling back to frontend: Readline\n",
      "debconf: unable to initialize frontend: Readline\n",
      "debconf: (This frontend requires a controlling tty.)\n",
      "debconf: falling back to frontend: Teletype\n",
      "dpkg-preconfigure: unable to re-open stdin: \n",
      "Selecting previously unselected package libxxf86dga1:amd64.\n",
      "(Reading database ... 156210 files and directories currently installed.)\n",
      "Preparing to unpack .../libxxf86dga1_2%3a1.1.4-1_amd64.deb ...\n",
      "Unpacking libxxf86dga1:amd64 (2:1.1.4-1) ...\n",
      "Selecting previously unselected package x11-utils.\n",
      "Preparing to unpack .../x11-utils_7.7+3build1_amd64.deb ...\n",
      "Unpacking x11-utils (7.7+3build1) ...\n",
      "Selecting previously unselected package xvfb.\n",
      "Preparing to unpack .../xvfb_2%3a1.19.6-1ubuntu4.10_amd64.deb ...\n",
      "Unpacking xvfb (2:1.19.6-1ubuntu4.10) ...\n",
      "Setting up xvfb (2:1.19.6-1ubuntu4.10) ...\n",
      "Setting up libxxf86dga1:amd64 (2:1.1.4-1) ...\n",
      "Setting up x11-utils (7.7+3build1) ...\n",
      "Processing triggers for man-db (2.8.3-2ubuntu0.1) ...\n",
      "Processing triggers for libc-bin (2.27-3ubuntu1.3) ...\n",
      "/sbin/ldconfig.real: /usr/local/lib/python3.7/dist-packages/ideep4py/lib/libmkldnn.so.0 is not a symbolic link\n",
      "\n",
      "\u001b[K     |████████████████████████████████| 1.5 MB 16.4 MB/s \n",
      "\u001b[?25h  Building wheel for gym (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "\u001b[K     |████████████████████████████████| 3.3 MB 14.8 MB/s \n",
      "\u001b[?25h  Building wheel for imageio (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
      "albumentations 0.1.12 requires imgaug<0.2.7,>=0.2.5, but you have imgaug 0.2.9 which is incompatible.\u001b[0m\n",
      "\u001b[K     |████████████████████████████████| 1.0 MB 13.3 MB/s \n",
      "\u001b[K     |████████████████████████████████| 1.3 MB 15.5 MB/s \n",
      "\u001b[K     |████████████████████████████████| 626 kB 58.9 MB/s \n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "    Preparing wheel metadata ... \u001b[?25l\u001b[?25hdone\n",
      "  Building wheel for gym (PEP 517) ... \u001b[?25l\u001b[?25hdone\n",
      "\u001b[K     |████████████████████████████████| 21.8 MB 1.2 MB/s \n",
      "\u001b[?25h"
     ]
    }
   ],
   "source": [
    "# HIDE OUTPUT\n",
    "if COLAB:\n",
    "  !sudo apt-get install -y xvfb ffmpeg x11-utils\n",
    "  !pip install -q 'gym==0.10.11'\n",
    "  !pip install -q 'imageio==2.4.0'\n",
    "  !pip install -q PILLOW\n",
    "  !pip install -q 'pyglet==1.3.2'\n",
    "  !pip install -q pyvirtualdisplay\n",
    "  !pip install -q tf-agents\n",
    "  !pip install -q pygame"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ljreOII4S9HN"
   },
   "source": [
    "We begin by importing needed Python libraries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "sMitx5qSgJk1"
   },
   "outputs": [],
   "source": [
    "import base64\n",
    "import imageio\n",
    "import IPython\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import PIL.Image\n",
    "import pyvirtualdisplay\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "from tf_agents.agents.dqn import dqn_agent\n",
    "from tf_agents.drivers import dynamic_step_driver\n",
    "from tf_agents.environments import suite_gym\n",
    "from tf_agents.environments import tf_py_environment\n",
    "from tf_agents.eval import metric_utils\n",
    "from tf_agents.metrics import tf_metrics\n",
    "from tf_agents.networks import q_network\n",
    "from tf_agents.policies import random_tf_policy\n",
    "from tf_agents.replay_buffers import tf_uniform_replay_buffer\n",
    "from tf_agents.trajectories import trajectory\n",
    "from tf_agents.utils import common\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tRZ-XNjrUc46"
   },
   "source": [
    "To allow this example to run in a notebook, we use a virtual display that will output an embedded video. If running this code outside a notebook, you could omit the virtual display and animate it directly to a window."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "J6HsdS5GbSjd"
   },
   "outputs": [],
   "source": [
    "# Set up a virtual display for rendering OpenAI gym environments.\n",
    "display = pyvirtualdisplay.Display(visible=0, size=(1400, 900)).start()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "LmC0NDhdLIKY"
   },
   "source": [
    "## Hyperparameters\n",
    "\n",
    "We must define Several hyperparameters for the algorithm to train the agent.  The TF-Agent example provided reasonably well-tuned hyperparameters for cart-pole.  Later we will adapt these to an Atari game."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "HC1kNrOsLSIZ"
   },
   "outputs": [],
   "source": [
    "# How long should training run?\n",
    "num_iterations = 20000\n",
    "# How many initial random steps, before training start, to\n",
    "# collect initial data.\n",
    "initial_collect_steps = 1000\n",
    "# How many steps should we run each iteration to collect\n",
    "# data from.\n",
    "collect_steps_per_iteration = 1\n",
    "# How much data should we store for training examples.\n",
    "replay_buffer_max_length = 100000\n",
    "\n",
    "batch_size = 64\n",
    "learning_rate = 1e-3\n",
    "# How often should the program provide an update.\n",
    "log_interval = 200\n",
    "\n",
    "# How many episodes should the program use for each evaluation.\n",
    "num_eval_episodes = 10\n",
    "# How often should an evaluation occur.\n",
    "eval_interval = 1000\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VMsJC3DEgI0x"
   },
   "source": [
    "## Environment\n",
    "\n",
    "TF-Agents use OpenAI gym environments to represent the task or problem to be solved. Standard environments can be created in TF-Agents using **tf_agents.environments** suites. TF-Agents has suites for loading environments from sources such as the OpenAI Gym, Atari, and DM Control. We begin by loading the CartPole environment from the OpenAI Gym suite. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "pYEz-S9gEv2-"
   },
   "outputs": [],
   "source": [
    "env_name = 'CartPole-v0'\n",
    "env = suite_gym.load(env_name)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "IIHYVBkuvPNw"
   },
   "source": [
    "We will quickly render this environment to see the visual representation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 417
    },
    "id": "RlO7WIQHu_7D",
    "outputId": "92a09964-5940-4331-fedb-c2879b4309d6"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=600x400 at 0x7F05D99F0310>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "env.reset()\n",
    "PIL.Image.fromarray(env.render())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "B9_lskPOey18"
   },
   "source": [
    "The `environment.step` method takes an `action` in the environment and returns a `TimeStep` tuple containing the following observation of the environment and the reward for the action.\n",
    "\n",
    "The `time_step_spec()` method returns the specification for the `TimeStep` tuple. Its `observation` attribute shows the shape of observations, the data types, and the ranges of allowed values. The `reward` attribute shows the same details for the reward.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "exDv57iHfwQV",
    "outputId": "35070414-3057-4b99-babb-34cd876b1669"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Observation Spec:\n",
      "BoundedArraySpec(shape=(4,), dtype=dtype('float32'), name='observation', minimum=[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38], maximum=[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38])\n"
     ]
    }
   ],
   "source": [
    "print('Observation Spec:')\n",
    "print(env.time_step_spec().observation)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "UxiSyCbBUQPi",
    "outputId": "6de36a8f-308b-4d2a-8f25-1fef73edb9e3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reward Spec:\n",
      "ArraySpec(shape=(), dtype=dtype('float32'), name='reward')\n"
     ]
    }
   ],
   "source": [
    "print('Reward Spec:')\n",
    "print(env.time_step_spec().reward)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "b_lHcIcqUaqB"
   },
   "source": [
    "The `action_spec()` method returns the shape, data types, and allowed values of valid actions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "bttJ4uxZUQBr",
    "outputId": "759a8f74-2e28-4384-b7d5-d8600514a275"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Action Spec:\n",
      "BoundedArraySpec(shape=(), dtype=dtype('int64'), name='action', minimum=0, maximum=1)\n"
     ]
    }
   ],
   "source": [
    "print('Action Spec:')\n",
    "print(env.action_spec())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "eJCgJnx3g0yY"
   },
   "source": [
    "In the Cartpole environment:\n",
    "\n",
    "-   `observation` is an array of 4 floats: \n",
    "    -   the position and velocity of the cart\n",
    "    -   the angular position and velocity of the pole \n",
    "-   `reward` is a scalar float value\n",
    "-   `action` is a scalar integer with only two possible values:\n",
    "    -   `0` — \"move left\"\n",
    "    -   `1` — \"move right\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "V2UGR5t_iZX-",
    "outputId": "817b7df9-54bd-4f43-869e-50dfaeab4e80"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time step:\n",
      "TimeStep(\n",
      "{'discount': array(1., dtype=float32),\n",
      " 'observation': array([-0.03279859,  0.03562892, -0.04014493, -0.04911802], dtype=float32),\n",
      " 'reward': array(0., dtype=float32),\n",
      " 'step_type': array(0, dtype=int32)})\n",
      "Next time step:\n",
      "TimeStep(\n",
      "{'discount': array(1., dtype=float32),\n",
      " 'observation': array([-0.03208601,  0.23130283, -0.04112729, -0.35419184], dtype=float32),\n",
      " 'reward': array(1., dtype=float32),\n",
      " 'step_type': array(1, dtype=int32)})\n"
     ]
    }
   ],
   "source": [
    "time_step = env.reset()\n",
    "print('Time step:')\n",
    "print(time_step)\n",
    "\n",
    "action = np.array(1, dtype=np.int32)\n",
    "\n",
    "next_time_step = env.step(action)\n",
    "print('Next time step:')\n",
    "print(next_time_step)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4JSc9GviWUBK"
   },
   "source": [
    "Usually, the program instantiates two environments: one for training and one for evaluation. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "id": "N7brXNIGWXjC"
   },
   "outputs": [],
   "source": [
    "train_py_env = suite_gym.load(env_name)\n",
    "eval_py_env = suite_gym.load(env_name)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zuUqXAVmecTU"
   },
   "source": [
    "The Cartpole environment, like most environments, is written in pure Python and is converted to TF-Agents and TensorFlow using the **TFPyEnvironment** wrapper. The original environment's API uses Numpy arrays. The **TFPyEnvironment** turns these to **Tensors** to make them compatible with Tensorflow agents and policies.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "id": "Xp-Y4mD6eDhF"
   },
   "outputs": [],
   "source": [
    "train_env = tf_py_environment.TFPyEnvironment(train_py_env)\n",
    "eval_env = tf_py_environment.TFPyEnvironment(eval_py_env)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "E9lW_OZYFR8A"
   },
   "source": [
    "## Agent\n",
    "\n",
    "An Agent represents the algorithm used to solve an RL problem. TF-Agents provides standard implementations of a variety of Agents:\n",
    "\n",
    "-   [DQN](https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf) (used in this example)\n",
    "-   [REINFORCE](http://www-anw.cs.umass.edu/~barto/courses/cs687/williams92simple.pdf)\n",
    "-   [DDPG](https://arxiv.org/pdf/1509.02971.pdf)\n",
    "-   [TD3](https://arxiv.org/pdf/1802.09477.pdf)\n",
    "-   [PPO](https://arxiv.org/abs/1707.06347)\n",
    "-   [SAC](https://arxiv.org/abs/1801.01290).\n",
    "\n",
    "You can only use the DQN agent in environments with a discrete action space. The DQN uses a QNetwork, a neural network model that learns to predict Q-Values (expected returns) for all actions given a state from the environment.\n",
    "\n",
    "The following code uses **tf_agents.networks.q_network** to create a QNetwork, passing in the **observation_spec**, **action_spec**, and a tuple describing the number and size of the model's hidden layers.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "id": "TgkdEPg_muzV"
   },
   "outputs": [],
   "source": [
    "fc_layer_params = (100,)\n",
    "\n",
    "q_net = q_network.QNetwork(\n",
    "    train_env.observation_spec(),\n",
    "    train_env.action_spec(),\n",
    "    fc_layer_params=fc_layer_params)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "z62u55hSmviJ"
   },
   "source": [
    "Now we use **tf_agents.agents.dqn.dqn_agent** to instantiate a **DqnAgent**. In addition to the **time_step_spec**, **action_spec** and the QNetwork, the agent constructor also requires an optimizer (in this case, **AdamOptimizer**), a loss function, and an integer step counter."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "id": "jbY4yrjTEyc9"
   },
   "outputs": [],
   "source": [
    "optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate)\n",
    "\n",
    "train_step_counter = tf.Variable(0)\n",
    "\n",
    "agent = dqn_agent.DqnAgent(\n",
    "    train_env.time_step_spec(),\n",
    "    train_env.action_spec(),\n",
    "    q_network=q_net,\n",
    "    optimizer=optimizer,\n",
    "    td_errors_loss_fn=common.element_wise_squared_loss,\n",
    "    train_step_counter=train_step_counter)\n",
    "\n",
    "agent.initialize()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "I0KLrEPwkn5x"
   },
   "source": [
    "## Policies\n",
    "\n",
    "A policy defines the way an agent acts in an environment. Typically, reinforcement learning aims to train the underlying model until the policy produces the desired outcome.\n",
    "\n",
    "In this example:\n",
    "\n",
    "* The desired outcome is keeping the pole balanced upright over the cart.\n",
    "* The policy returns an action (left or right) for each `time_step` observation.\n",
    "\n",
    "Agents contain two policies: \n",
    "\n",
    "*  **agent.policy** -  The algorithm uses this main policy for evaluation and deployment.\n",
    "* **agent.collect_policy** - The algorithm this secondary policy for data collection.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "id": "BwY7StuMkuV4"
   },
   "outputs": [],
   "source": [
    "eval_policy = agent.policy\n",
    "collect_policy = agent.collect_policy\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2Qs1Fl3dV0ae"
   },
   "source": [
    "You can create policies independently of agents. For example, use **random_tf_policy** to create a policy that will randomly select an action for each **time_step**. We will use this random policy to create initial collection data to begin training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "id": "HE37-UCIrE69"
   },
   "outputs": [],
   "source": [
    "random_policy = random_tf_policy.RandomTFPolicy(train_env.time_step_spec(),\n",
    "                                                train_env.action_spec())\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "dOlnlRRsUbxP"
   },
   "source": [
    "To get an action from a policy, call the **policy.action** method. The **time_step** contains the observation from the environment. This method returns a **PolicyStep**, which is a named tuple with three components:\n",
    "\n",
    "* **action** - The action to be taken (in this case, 0 or 1).\n",
    "* **state** - Used for stateful (that is, RNN-based) policies.\n",
    "* **info** - Auxiliary data, such as log probabilities of actions.\n",
    "\n",
    "Next, we create an environment and set up the random policy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "5gCcpXswVAxk",
    "outputId": "90e8b190-e56a-4f52-ff51-401d0d228615"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PolicyStep(action=<tf.Tensor: shape=(1,), dtype=int64, numpy=array([0])>, state=(), info=())"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "example_environment = tf_py_environment.TFPyEnvironment(\n",
    "    suite_gym.load('CartPole-v0'))\n",
    "time_step = example_environment.reset()\n",
    "random_policy.action(time_step)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "94rCXQtbUbXv"
   },
   "source": [
    "## Metrics and Evaluation\n",
    "\n",
    "The most common metric used to evaluate a policy is the average return. The return is the sum of rewards obtained while running a policy in an environment for an episode. Several episodes are run, creating an average return. The following function computes the average return, given the policy, environment, and number of episodes. We will use this same evaluation for Atari.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "id": "bitzHo5_UbXy"
   },
   "outputs": [],
   "source": [
    "def compute_avg_return(environment, policy, num_episodes=10):\n",
    "\n",
    "    total_return = 0.0\n",
    "    for _ in range(num_episodes):\n",
    "\n",
    "        time_step = environment.reset()\n",
    "        episode_return = 0.0\n",
    "\n",
    "        while not time_step.is_last():\n",
    "            action_step = policy.action(time_step)\n",
    "            time_step = environment.step(action_step.action)\n",
    "            episode_return += time_step.reward\n",
    "        total_return += episode_return\n",
    "\n",
    "    avg_return = total_return / num_episodes\n",
    "    return avg_return.numpy()[0]\n",
    "\n",
    "\n",
    "# See also the metrics module for standard implementations\n",
    "# of different metrics.\n",
    "# https://github.com/tensorflow/agents/tree/master/tf_agents/metrics\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_snCVvq5Z8lJ"
   },
   "source": [
    "Running this computation on the `random_policy` shows a baseline performance in the environment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "9bgU6Q6BZ8Bp",
    "outputId": "064703f6-5092-4b62-8f33-1bb617b25e66"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15.2"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "compute_avg_return(eval_env, random_policy, num_eval_episodes)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NLva6g2jdWgr"
   },
   "source": [
    "## Replay Buffer\n",
    "\n",
    "The replay buffer keeps track of data collected from the environment. This tutorial uses **TFUniformReplayBuffer**. The constructor requires the specs for the data it will be collecting. This value is available from the agent using the **collect_data_spec** method. The batch size and maximum buffer length are also required.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "id": "vX2zGUWJGWAl"
   },
   "outputs": [],
   "source": [
    "replay_buffer = tf_uniform_replay_buffer.TFUniformReplayBuffer(\n",
    "    data_spec=agent.collect_data_spec,\n",
    "    batch_size=train_env.batch_size,\n",
    "    max_length=replay_buffer_max_length)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ZGNTDJpZs4NN"
   },
   "source": [
    "For most agents, **collect_data_spec** is a named tuple called **Trajectory**, containing the specs for observations, actions, rewards, and other items."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "_IZ-3HcqgE1z",
    "outputId": "3aa42341-bb6a-4281-83b8-00e97c175ee8"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Trajectory(\n",
       "{'action': BoundedTensorSpec(shape=(), dtype=tf.int64, name='action', minimum=array(0), maximum=array(1)),\n",
       " 'discount': BoundedTensorSpec(shape=(), dtype=tf.float32, name='discount', minimum=array(0., dtype=float32), maximum=array(1., dtype=float32)),\n",
       " 'next_step_type': TensorSpec(shape=(), dtype=tf.int32, name='step_type'),\n",
       " 'observation': BoundedTensorSpec(shape=(4,), dtype=tf.float32, name='observation', minimum=array([-4.8000002e+00, -3.4028235e+38, -4.1887903e-01, -3.4028235e+38],\n",
       "      dtype=float32), maximum=array([4.8000002e+00, 3.4028235e+38, 4.1887903e-01, 3.4028235e+38],\n",
       "      dtype=float32)),\n",
       " 'policy_info': (),\n",
       " 'reward': TensorSpec(shape=(), dtype=tf.float32, name='reward'),\n",
       " 'step_type': TensorSpec(shape=(), dtype=tf.int32, name='step_type')})"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "agent.collect_data_spec"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "rVD5nQ9ZGo8_"
   },
   "source": [
    "## Data Collection\n",
    "\n",
    "Now execute the random policy in the environment for a few steps, recording the data in the replay buffer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "id": "wr1KSAEGG4h9"
   },
   "outputs": [],
   "source": [
    "def collect_step(environment, policy, buffer):\n",
    "    time_step = environment.current_time_step()\n",
    "    action_step = policy.action(time_step)\n",
    "    next_time_step = environment.step(action_step.action)\n",
    "    traj = trajectory.from_transition(time_step, action_step, \\\n",
    "                                      next_time_step)\n",
    "\n",
    "    # Add trajectory to the replay buffer\n",
    "    buffer.add_batch(traj)\n",
    "\n",
    "\n",
    "def collect_data(env, policy, buffer, steps):\n",
    "    for _ in range(steps):\n",
    "        collect_step(env, policy, buffer)\n",
    "\n",
    "\n",
    "collect_data(train_env, random_policy, replay_buffer, steps=100)\n",
    "\n",
    "# This loop is so common in RL, that we provide standard implementations.\n",
    "# For more details see the drivers module.\n",
    "# https://www.tensorflow.org/agents/api_docs/python/tf_agents/drivers\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "84z5pQJdoKxo"
   },
   "source": [
    "The replay buffer is now a collection of Trajectories. The agent needs access to the replay buffer. TF-Agents provides this access by creating an iterable **tf.data.Dataset** pipeline, which will feed data to the agent.\n",
    "\n",
    "Each row of the replay buffer only stores a single observation step. But since the DQN Agent needs both the current and following observation to compute the loss, the dataset pipeline will sample two adjacent rows for each item in the batch (**num_steps=2**).\n",
    "\n",
    "The program also optimizes this dataset by running parallel calls and prefetching data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ba7bilizt_qW",
    "outputId": "4d300510-c7a4-4802-b5ce-2849339e124e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/autograph/impl/api.py:377: ReplayBuffer.get_next (from tf_agents.replay_buffers.replay_buffer) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `as_dataset(..., single_deterministic_pass=False) instead.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<PrefetchDataset element_spec=(Trajectory(\n",
       "{'action': TensorSpec(shape=(64, 2), dtype=tf.int64, name=None),\n",
       " 'discount': TensorSpec(shape=(64, 2), dtype=tf.float32, name=None),\n",
       " 'next_step_type': TensorSpec(shape=(64, 2), dtype=tf.int32, name=None),\n",
       " 'observation': TensorSpec(shape=(64, 2, 4), dtype=tf.float32, name=None),\n",
       " 'policy_info': (),\n",
       " 'reward': TensorSpec(shape=(64, 2), dtype=tf.float32, name=None),\n",
       " 'step_type': TensorSpec(shape=(64, 2), dtype=tf.int32, name=None)}), BufferInfo(ids=TensorSpec(shape=(64, 2), dtype=tf.int64, name=None), probabilities=TensorSpec(shape=(64,), dtype=tf.float32, name=None)))>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Dataset generates trajectories with shape [Bx2x...]\n",
    "dataset = replay_buffer.as_dataset(\n",
    "    num_parallel_calls=3, \n",
    "    sample_batch_size=batch_size, \n",
    "    num_steps=2).prefetch(3)\n",
    "\n",
    "\n",
    "dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "K13AST-2ppOq",
    "outputId": "1c87f68a-3a2c-4361-9dfd-248c7ec57398"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<tensorflow.python.data.ops.iterator_ops.OwnedIterator object at 0x7f05c0006c10>\n"
     ]
    }
   ],
   "source": [
    "iterator = iter(dataset)\n",
    "\n",
    "print(iterator)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "hBc9lj9VWWtZ"
   },
   "source": [
    "## Training the agent\n",
    "\n",
    "Two things must happen during the training loop:\n",
    "\n",
    "* Collect data from the environment\n",
    "* Use that data to train the agent's neural network(s)\n",
    "\n",
    "This example also periodically evaluates the policy and prints the current score.\n",
    "\n",
    "The following will take ~5 minutes to run."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "0pTbJ3PeyF-u",
    "outputId": "ccdff849-ea33-4212-edbe-dffec9322126"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:1082: calling foldr_v2 (from tensorflow.python.ops.functional_ops) with back_prop=False is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "back_prop=False is deprecated. Consider using tf.stop_gradient instead.\n",
      "Instead of:\n",
      "results = tf.foldr(fn, elems, back_prop=False)\n",
      "Use:\n",
      "results = tf.nest.map_structure(tf.stop_gradient, tf.foldr(fn, elems))\n",
      "step = 200: loss = 23.158374786376953\n",
      "step = 400: loss = 7.158817768096924\n",
      "step = 600: loss = 30.97699737548828\n",
      "step = 800: loss = 9.831337928771973\n",
      "step = 1000: loss = 9.664928436279297\n",
      "step = 1000: Average Return = 13.199999809265137\n",
      "step = 1200: loss = 10.27550220489502\n",
      "step = 1400: loss = 17.813919067382812\n",
      "step = 1600: loss = 8.011082649230957\n",
      "step = 1800: loss = 28.170230865478516\n",
      "step = 2000: loss = 28.02679443359375\n",
      "step = 2000: Average Return = 40.099998474121094\n",
      "step = 2200: loss = 3.2347989082336426\n",
      "step = 2400: loss = 55.28818893432617\n",
      "step = 2600: loss = 18.277198791503906\n",
      "step = 2800: loss = 4.626098155975342\n",
      "step = 3000: loss = 14.528213500976562\n",
      "step = 3000: Average Return = 61.79999923706055\n",
      "step = 3200: loss = 59.28561782836914\n",
      "step = 3400: loss = 76.63031005859375\n",
      "step = 3600: loss = 63.14342498779297\n",
      "step = 3800: loss = 110.42674255371094\n",
      "step = 4000: loss = 5.175446510314941\n",
      "step = 4000: Average Return = 146.0\n",
      "step = 4200: loss = 5.881635665893555\n",
      "step = 4400: loss = 7.868609428405762\n",
      "step = 4600: loss = 6.599028587341309\n",
      "step = 4800: loss = 69.79821014404297\n",
      "step = 5000: loss = 219.33493041992188\n",
      "step = 5000: Average Return = 119.5999984741211\n",
      "step = 5200: loss = 45.901084899902344\n",
      "step = 5400: loss = 4.329599380493164\n",
      "step = 5600: loss = 64.89082336425781\n",
      "step = 5800: loss = 42.906700134277344\n",
      "step = 6000: loss = 10.80639362335205\n",
      "step = 6000: Average Return = 190.1999969482422\n",
      "step = 6200: loss = 33.47439193725586\n",
      "step = 6400: loss = 9.312165260314941\n",
      "step = 6600: loss = 124.09418487548828\n",
      "step = 6800: loss = 9.645675659179688\n",
      "step = 7000: loss = 12.178140640258789\n",
      "step = 7000: Average Return = 184.60000610351562\n",
      "step = 7200: loss = 9.637611389160156\n",
      "step = 7400: loss = 7.316198348999023\n",
      "step = 7600: loss = 139.92269897460938\n",
      "step = 7800: loss = 7.6530256271362305\n",
      "step = 8000: loss = 16.512592315673828\n",
      "step = 8000: Average Return = 191.3000030517578\n",
      "step = 8200: loss = 104.84465789794922\n",
      "step = 8400: loss = 164.78646850585938\n",
      "step = 8600: loss = 124.94630432128906\n",
      "step = 8800: loss = 13.862188339233398\n",
      "step = 9000: loss = 154.0853271484375\n",
      "step = 9000: Average Return = 200.0\n",
      "step = 9200: loss = 125.97179412841797\n",
      "step = 9400: loss = 153.52854919433594\n",
      "step = 9600: loss = 97.84358215332031\n",
      "step = 9800: loss = 55.670570373535156\n",
      "step = 10000: loss = 15.632448196411133\n",
      "step = 10000: Average Return = 200.0\n",
      "step = 10200: loss = 8.194206237792969\n",
      "step = 10400: loss = 13.93640422821045\n",
      "step = 10600: loss = 11.790799140930176\n",
      "step = 10800: loss = 444.7298278808594\n",
      "step = 11000: loss = 378.853271484375\n",
      "step = 11000: Average Return = 197.0\n",
      "step = 11200: loss = 13.082895278930664\n",
      "step = 11400: loss = 268.9317626953125\n",
      "step = 11600: loss = 123.26766204833984\n",
      "step = 11800: loss = 81.99503326416016\n",
      "step = 12000: loss = 94.90630340576172\n",
      "step = 12000: Average Return = 200.0\n",
      "step = 12200: loss = 10.287437438964844\n",
      "step = 12400: loss = 275.0940246582031\n",
      "step = 12600: loss = 115.75547790527344\n",
      "step = 12800: loss = 668.2427978515625\n",
      "step = 13000: loss = 798.7186279296875\n",
      "step = 13000: Average Return = 196.60000610351562\n",
      "step = 13200: loss = 21.640256881713867\n",
      "step = 13400: loss = 313.7167663574219\n",
      "step = 13600: loss = 17.465240478515625\n",
      "step = 13800: loss = 715.4552001953125\n",
      "step = 14000: loss = 13.271897315979004\n",
      "step = 14000: Average Return = 197.89999389648438\n",
      "step = 14200: loss = 20.86071014404297\n",
      "step = 14400: loss = 86.7576904296875\n",
      "step = 14600: loss = 529.219970703125\n",
      "step = 14800: loss = 969.0336303710938\n",
      "step = 15000: loss = 298.5212707519531\n",
      "step = 15000: Average Return = 198.5\n",
      "step = 15200: loss = 372.925537109375\n",
      "step = 15400: loss = 214.28077697753906\n",
      "step = 15600: loss = 11.535277366638184\n",
      "step = 15800: loss = 40.361358642578125\n",
      "step = 16000: loss = 19.93735122680664\n",
      "step = 16000: Average Return = 199.39999389648438\n",
      "step = 16200: loss = 32.60084533691406\n",
      "step = 16400: loss = 18.340595245361328\n",
      "step = 16600: loss = 16.289039611816406\n",
      "step = 16800: loss = 189.3881378173828\n",
      "step = 17000: loss = 39.77809143066406\n",
      "step = 17000: Average Return = 200.0\n",
      "step = 17200: loss = 74.69547271728516\n",
      "step = 17400: loss = 83.34622192382812\n",
      "step = 17600: loss = 167.67913818359375\n",
      "step = 17800: loss = 1286.816650390625\n",
      "step = 18000: loss = 4.552798271179199\n",
      "step = 18000: Average Return = 200.0\n",
      "step = 18200: loss = 1149.6190185546875\n",
      "step = 18400: loss = 39.40950012207031\n",
      "step = 18600: loss = 785.230712890625\n",
      "step = 18800: loss = 20.107412338256836\n",
      "step = 19000: loss = 483.009765625\n",
      "step = 19000: Average Return = 200.0\n",
      "step = 19200: loss = 5.911262512207031\n",
      "step = 19400: loss = 16.59900665283203\n",
      "step = 19600: loss = 16.253849029541016\n",
      "step = 19800: loss = 124.63180541992188\n",
      "step = 20000: loss = 22.45917320251465\n",
      "step = 20000: Average Return = 198.3000030517578\n"
     ]
    }
   ],
   "source": [
    "# (Optional) Optimize by wrapping some of the code in a graph\n",
    "# using TF function.\n",
    "agent.train = common.function(agent.train)\n",
    "\n",
    "# Reset the train step\n",
    "agent.train_step_counter.assign(0)\n",
    "\n",
    "# Evaluate the agent's policy once before training.\n",
    "avg_return = compute_avg_return(eval_env, agent.policy,\n",
    "                                num_eval_episodes)\n",
    "returns = [avg_return]\n",
    "\n",
    "for _ in range(num_iterations):\n",
    "\n",
    "    # Collect a few steps using collect_policy and \n",
    "    # save to the replay buffer.\n",
    "    for _ in range(collect_steps_per_iteration):\n",
    "        collect_step(train_env, agent.collect_policy, replay_buffer)\n",
    "\n",
    "    # Sample a batch of data from the buffer and update \n",
    "    # the agent's network.\n",
    "    experience, unused_info = next(iterator)\n",
    "    train_loss = agent.train(experience).loss\n",
    "\n",
    "    step = agent.train_step_counter.numpy()\n",
    "\n",
    "    if step % log_interval == 0:\n",
    "        print('step = {0}: loss = {1}'.format(step, train_loss))\n",
    "\n",
    "    if step % eval_interval == 0:\n",
    "        avg_return = compute_avg_return(eval_env, agent.policy,\n",
    "                                        num_eval_episodes)\n",
    "        print('step = {0}: Average Return = {1}'.format(step, avg_return))\n",
    "        returns.append(avg_return)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "68jNcA_TiJDq"
   },
   "source": [
    "## Visualization and Plots\n",
    "\n",
    "Use **matplotlib.pyplot** to chart how the policy improved during training.\n",
    "\n",
    "One iteration of **Cartpole-v0** consists of 200 time steps. The environment rewards `+1` for each step the pole stays up, so the maximum return for one episode is 200. The charts show the return increasing towards that maximum each time the algorithm evaluates it during training. (It may be a little unstable and not increase each time monotonically.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 301
    },
    "id": "NxtL1mbOYCVO",
    "outputId": "566262f5-cb60-409b-9234-fa0f2e57ca04"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3.859999799728394, 250.0)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "iterations = range(0, num_iterations + 1, eval_interval)\n",
    "plt.plot(iterations, returns)\n",
    "plt.ylabel('Average Return')\n",
    "plt.xlabel('Iterations')\n",
    "plt.ylim(top=250)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "M7-XpPP99Cy7"
   },
   "source": [
    "## Videos\n",
    "\n",
    "The charts are nice. But more exciting is seeing an agent performing a task in an environment. \n",
    "\n",
    "First, create a function to embed videos in the notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "id": "ULaGr8pvOKbl"
   },
   "outputs": [],
   "source": [
    "def embed_mp4(filename):\n",
    "    \"\"\"Embeds an mp4 file in the notebook.\"\"\"\n",
    "    video = open(filename, 'rb').read()\n",
    "    b64 = base64.b64encode(video)\n",
    "    tag = '''\n",
    "  <video width=\"640\" height=\"480\" controls>\n",
    "    <source src=\"data:video/mp4;base64,{0}\" type=\"video/mp4\">\n",
    "  Your browser does not support the video tag.\n",
    "  </video>'''.format(b64.decode())\n",
    "\n",
    "    return IPython.display.HTML(tag)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "9c_PH-pX4Pr5"
   },
   "source": [
    "Now iterate through a few episodes of the Cartpole game with the agent. The underlying Python environment (the one \"inside\" the TensorFlow environment wrapper) provides a `render()` method, which outputs an image of the environment state. We can collect these frames into a video."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 574
    },
    "id": "owOVWB158NlF",
    "outputId": "e60105fe-c43a-4609-91c0-feeff0cd2281"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:root:IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (400, 600) to (400, 608) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to None (risking incompatibility). You may also see a FFMPEG warning concerning speedloss due to data not being aligned.\n",
      "/usr/local/lib/python3.7/dist-packages/imageio/plugins/ffmpeg.py:727: DeprecationWarning: tostring() is deprecated. Use tobytes() instead.\n",
      "  self._proc.stdin.write(im.tostring())\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "  <video width=\"640\" height=\"480\" controls>\n",
       "    <source src=\"data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAz2JtZGF0AAACrgYF//+q3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1MiByMjg1NCBlOWE1OTAzIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNyAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yNS4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAB1WWIhAA3//72rvzLK0cLlS4dWXuzUfLoSXL9iDB9aAAAAwAAAwAAJuKiZ0WFMeJsgAAALmAIWElDyDzETFWKgSvGXwOeIBP/KAbxuNtLcPJLy46URWRLMxbl9iS6rcLY0Nh4j6bVYsk3jHh5zCKBQbgg19TLd9OgEt5JC45BUGZi7bF95l+iwi86bREEykNE9jSWlruXkTD+/k5f79OE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AQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAIAAAAAAIAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAIAAAAAAIAAAIAAAAAAQAABAAAAAABAAAGAAAAAAEAAAIAAAAAAwAABAAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAGAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAEAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAEAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAGAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAGAAAAAAEAAAIAAAAAAQAABAAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAGAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAGAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAGAAAAAAEAAAIAAAAAAQAACAAAAAACAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAIAAAAAAIAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAIAAAAAAIAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAIAAAAAAIAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAEAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACAAAAAACAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACAAAAAACAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACAAAAAACAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAA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\" type=\"video/mp4\">\n",
       "  Your browser does not support the video tag.\n",
       "  </video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# HIDE OUTPUT\n",
    "def create_policy_eval_video(policy, filename, num_episodes=5, fps=30):\n",
    "    filename = filename + \".mp4\"\n",
    "    with imageio.get_writer(filename, fps=fps) as video:\n",
    "        for _ in range(num_episodes):\n",
    "            time_step = eval_env.reset()\n",
    "            video.append_data(eval_py_env.render())\n",
    "            while not time_step.is_last():\n",
    "                action_step = policy.action(time_step)\n",
    "                time_step = eval_env.step(action_step.action)\n",
    "                video.append_data(eval_py_env.render())\n",
    "    return embed_mp4(filename)\n",
    "\n",
    "\n",
    "create_policy_eval_video(agent.policy, \"trained-agent\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "povaAOcZygLw"
   },
   "source": [
    "For fun, compare the trained agent (above) to an agent moving randomly. (It does not do as well.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 574
    },
    "id": "pJZIdC37yNH4",
    "outputId": "2a43f1f7-6c80-4e90-c4b3-42a9e769d653"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:root:IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (400, 600) to (400, 608) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to None (risking incompatibility). You may also see a FFMPEG warning concerning speedloss due to data not being aligned.\n",
      "/usr/local/lib/python3.7/dist-packages/imageio/plugins/ffmpeg.py:727: DeprecationWarning: tostring() is deprecated. Use tobytes() instead.\n",
      "  self._proc.stdin.write(im.tostring())\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "  <video width=\"640\" height=\"480\" controls>\n",
       "    <source src=\"data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAM71tZGF0AAACrgYF//+q3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1MiByMjg1NCBlOWE1OTAzIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNyAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yNS4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAACAWWIhAA3//72rvzLK0cLlS4dWXuzUfLoSXL9iDB9aAAAAwAAAwAAJuKiZ0WFMeJsgAAALmAIWElDyDzETFWKgSvGXyx8WQACu+UCh89X+RpTVpFTJzWrbG1aS2MIjs+KP+SQqEGEIql/ul6F5I7bYrdVMX66l6wurBHDYQbNibQd9NpZXBtEjf/dZcvCtrs6M2tQPapiiUM1Uy6S6oqy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\" type=\"video/mp4\">\n",
       "  Your browser does not support the video tag.\n",
       "  </video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# HIDE OUTPUT\n",
    "create_policy_eval_video(random_policy, \"random-agent\")\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "anaconda-cloud": {},
  "colab": {
   "collapsed_sections": [],
   "name": "Copy of t81_558_class_12_03_keras_reinforce.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3.9 (tensorflow)",
   "language": "python",
   "name": "tensorflow"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
